package editorsvg.gui.generico;

import editorsvg.gui.generico.Aceptable;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.KeyStroke;

/**
 * Di�logo generico que contiene un panel interior y permite ser acepado o cancelado.
 *
 * @author  Jorge Berjano
 */
public class DialogoAceptarCancelar extends JDialog implements Aceptable {
    /** Valor del resultado cuando se pulsa cancelar */
    public static final int CANCELAR = 0;
    /** Valor del resultado cuando se pulsa aceptar */
    public static final int ACEPTAR = 1;
    
    /** Resultado del dialogo */
    private int resultado = CANCELAR;
    
    /** Panel interior que contiene el dialogo */
    private JComponent panelInterior;
    
    /** Constructor */
    public DialogoAceptarCancelar(Frame parent, String titulo) {
        super(parent, true);
        setTitle(titulo);
        initComponents();
        inicializar();
    }
    
    public DialogoAceptarCancelar(Frame parent, String titulo, JComponent panelInterior) {
        this(parent, titulo);
        setPanelInterior(panelInterior);
    }
    
    private void inicializar() {
        
        // Se establece el bot�n por defecto
        this.getRootPane().setDefaultButton(botonAceptar);
        
        // Se hace una 'Keyboard Binding' para procesar la tecla de escape
        KeyStroke ks = KeyStroke.getKeyStroke("ESCAPE");
        Action action = new AbstractAction("cancelar") {
            public void actionPerformed(ActionEvent evt) {
                cerrarDialogo(CANCELAR);
            }
        };
        Object binding = action.getValue(action.NAME);
        JComponent comp = getRootPane();
        comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, binding);
        comp.getActionMap().put(binding, action);
    }
    
    public JComponent getPanelInterior() {
        return panelInterior;
    }
    
    public void setPanelInterior(JComponent panelInterior) {
        this.panelInterior = panelInterior;
        getContentPane().add(panelInterior, java.awt.BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
    }
    
    /**
     * Obtiene el resultado del di�logo.
     *
     * @return El resultado del di�logo: ACEPTAR o CANCELAR
     */
    public int getResultado() {
        return resultado;
    }
    
    /**
     * Cierra el di�logo.
     * @param resultado El resultado del di�logo.
     */
    protected void cerrarDialogo(int resultado) {
        this.resultado = resultado;
        
        if (panelInterior instanceof Verificable) {
            Verificable panelVerificable = (Verificable) panelInterior;
            switch (resultado) {
                case ACEPTAR:
                    if (!panelVerificable.verificarAceptar())
                        return;
                    break;
                case CANCELAR:
                    if (!panelVerificable.verificarCancelar())
                        return;
                    break;
            }
        }
        
        if (panelInterior instanceof Aceptable) {
            Aceptable panelAceptable = (Aceptable) panelInterior;
            switch (resultado) {
                case ACEPTAR:
                    if (!panelAceptable.aceptar())
                        return;
                    break;
                case CANCELAR:
                    if (!panelAceptable.cancelar())
                        return;
                    break;
            }
        }
        
        setVisible(false);
        dispose();
    }
    
    /**
     * Habilita o deshabilita el bot�n aceptar.
     * @param habilitar True para habilitar, false para deshabilitar.
     */
    public void habilitarAceptar(boolean habilitar) {
        botonAceptar.setEnabled(habilitar);
    }
    
    /**
     * Habilita o deshabilita el bot�n cancelar.
     * @param habilitar True para habilitar, false para deshabilitar.
     */    
    public void habilitarCancelar(boolean habilitar) {
        botonCancelar.setEnabled(habilitar);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelBotones = new javax.swing.JPanel();
        botonAceptar = new javax.swing.JButton();
        botonCancelar = new javax.swing.JButton();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                closeDialog(evt);
            }
        });

        botonAceptar.setText("Aceptar");
        botonAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAceptarActionPerformed(evt);
            }
        });
        panelBotones.add(botonAceptar);

        botonCancelar.setText("Cancelar");
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });
        panelBotones.add(botonCancelar);

        getContentPane().add(panelBotones, java.awt.BorderLayout.SOUTH);

        pack();
    }// </editor-fold>//GEN-END:initComponents
    
    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        cerrarDialogo(CANCELAR);
}//GEN-LAST:event_botonCancelarActionPerformed
    
    private void botonAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAceptarActionPerformed
        cerrarDialogo(ACEPTAR);
    }//GEN-LAST:event_botonAceptarActionPerformed
    
    /** Closes the dialog */
    private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog
        cerrarDialogo(CANCELAR);
    }//GEN-LAST:event_closeDialog
    
    public boolean aceptar() {
        cerrarDialogo(ACEPTAR);
        return true;
    }
    
    public boolean cancelar() {
        cerrarDialogo(CANCELAR);
        return true;
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAceptar;
    private javax.swing.JButton botonCancelar;
    private javax.swing.JPanel panelBotones;
    // End of variables declaration//GEN-END:variables
    
}
